/**
 * @file Entrega.java
 * @brief Entidad que representa las entregas de  medicamentos en farmacia.
 *
 * Copyright (C)  - April [2011]
 *
 * @author Fruela Palacio Pérez.
 * @version 01.01
 *
 * @footnote e-mail:  fruela@correo.ugr.es fruli_88@hotmail.com
 */

package GestorFarmacia;

import GestorFarmacia.Medicamento;
import GestorFarmacia.MedicamentoDAO;
import Definiciones.Definiciones;
import GestorCitas.LineaRecetaDAO;
import GestorCitas.LineaReceta;
import java.util.Date;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import Servicios.Conexion;

/**
 *
 * @author Fruela
 */

/**
 * @class Entrega
 * @brief Representa las entregas de medicamentos.
 */
public class Entrega {

    /*Atributos*/


    // Identificador úncio de la entrega.
    private Integer _id_entrega;


     // Fecha en la que se realiza la entrega.
    private Date _fecha_entrega;


    // Identificador de la líneade la receta a la que pertenece la entrega
    private Integer _idLineaReceta;


    //Identificador del usuario del tipo Farmaceutico que ha realizado la entrega.
    private Integer _idFarmaceutico;


    //Estado actual de la entrega.
    private Definiciones.Estado _estado;





        /** Constructor por defecto **/
    public Entrega() {
        this._id_entrega = null;
        this._fecha_entrega = null;
        this._idLineaReceta = null;
        this._idFarmaceutico = null;
        this._estado = null;
    }

           /**
     * @brief Contructor con parametros de Entrega
     * @param id Codigo de identificacion de la entrega.
     * @param fecha Fecha del inicio de la entrega.
     * @param pertenece Codigo de identificacion al que pertenece la entrega.
     * @param entregado Codigo de identificacion a quien es entregada  la entrega .
     * @param estado Estado actual de la entrega.
     */
    public Entrega(Integer id, Date fecha, Integer pertenece, Integer entregado, Definiciones.Estado estado){
        this._id_entrega = id;
        this._fecha_entrega = fecha;
        this._idLineaReceta = pertenece;
        this._idFarmaceutico = entregado;
        this._estado = estado;
    }




     /*Métodos de la clase*/

    public  static void add ( Entrega e ) throws SQLException, IOException, ClassNotFoundException {
        EntregaDAO.add(e);
    }
    public static void delete (  Entrega e ) throws SQLException, IOException, ClassNotFoundException {
        EntregaDAO.delete(e);
    }
    public static void update ( Entrega e ) throws SQLException, IOException, ClassNotFoundException {
        EntregaDAO.update(e);
    }
    public static Entrega get ( Integer iden ) throws SQLException, IOException, ClassNotFoundException {
        Entrega entrega_buscado = EntregaDAO.get(iden);
        return entrega_buscado;
    }
    public static Entrega [] get (Integer iden ,Date fecha,Definiciones.Estado estado) throws SQLException,
                IOException, ClassNotFoundException, ParseException {
        Entrega[] entrega_1 = EntregaDAO.get(iden,fecha,estado);// nO FALTAN PARAMETORS?
        return entrega_1;
    }



      /* Métodos d e instancia */

    /**
     * @brief Obtiene un identificador de la entrega.
     * @return Codigo de la entrega
     */
    public  Integer getIdEntrega(){
        return this._id_entrega;
    }


    /**
     * @brief Devuelve la fecha inicio de la entrega.
     * @return Fecha de la entrega.
     */
    public  Date getFechaEntrega(){
        return this._fecha_entrega;
    }

    /**
     * @brief Obtiene un identificador de a quién pertenece la entrega.
     * @return Codigo de pertencencia.
     */
    public Integer getIdLineaReceta(){
         return this._idLineaReceta;
    }

    /**
     * @brief Obtiene un identificador de quié realiza la entrega.
     * @return Codigo de entregado por.
     */
    public Integer getIdFarmaceutico(){
        return this._idFarmaceutico;
    }

    /**
     * @brief Obtiene una palabra indicando el valor actual de la entrega.
     * @return Estdo actual de la entrega.
     */
    public  Definiciones.Estado getEstadoEntrega(){
         return  this._estado  ;
    }


    /**
     * @brief Obtiene un identificador del medicamento de la entrega.
     * @return Codigo de medicamento.
     */
    public Integer getMedicamento()throws SQLException, IOException, ClassNotFoundException{
         Medicamento medicamento_1 = MedicamentoDAO.get(this._id_entrega);
         return medicamento_1.getIdMedicamento();
    }

    /**
     * @brief Obtiene a la  LineaReceta que pertenece de la entrega.
     * @return LineaReceta.
     */
    public  LineaReceta getLineaReceta() throws SQLException, IOException, ClassNotFoundException {
         return LineaRecetaDAO.get(this._idLineaReceta);
    }

    /**
     * @brief Obtiene al trabajador que solicito la entrega  que pertenece de la entrega.
     * @return médico.
     */
    public  Medicamento getMedico()throws SQLException, IOException, ClassNotFoundException{/*MIRAR*/
         Medicamento medicamento_1 = MedicamentoDAO.get(this._idFarmaceutico);
         return medicamento_1;
    }//Obtiene el médico que la entrega , en caso de estar entregada.


     /**
     * @brief Obtiene una lista de las entregas realizadas.
     * @return Vector de entregas.
     */
    public static Entrega[] getEntregas(Date fechaInicio,
            Date fechaFin,
            Integer idMedicamento,
            Definiciones.Estado estado)throws SQLException, IOException, ClassNotFoundException{/*Falta por terminar*/


        Entrega[] v_entregas = null;
        String busqueda = "";
        ArrayList<Entrega> entregas_1 = new ArrayList<Entrega>();
        Definiciones.Estado estado_ = null;
        DateFormat formatoFecha = new  SimpleDateFormat("yyyy-MM-dd");
        ResultSet entrega;



        // Generamos la consulta a la BD

        if(fechaInicio != null){
            busqueda += "fechaInicio = \'"+ formatoFecha.format(fechaInicio)+"\' AND";
        }
        if(fechaFin != null){
            busqueda += "fechaFin = \'"+ formatoFecha.format(fechaFin)+"\' AND";
        }
        if(idMedicamento != null) busqueda += "idMedicamento=\'" + idMedicamento + "\'";
        if(estado != null){
            if(!busqueda.equals("")) busqueda += " AND ";
            if(estado.toString().equals("DISPONIBLE")) busqueda += "estado=\'d\'";
            else busqueda += "estado=\'n\'";
        }


        Conexion.conectar();
	if(!busqueda.equals("")) entrega = Conexion.consultar("SELECT * FROM Entrega WHERE " + busqueda + ";");
        else entrega = Conexion.consultar("SELECT * FROM Entrega");


	// Creamos el listado de Entregas
        if(entrega.next()){//encontrado

            try{
            if(entrega.getString("estado").equals("p"))estado_ = Definiciones.Estado.PENDIENTE;
                else if(entrega.getString("estado").equals("s"))estado_ = Definiciones.Estado.SUMINISTRADA;
                    else if(entrega.getString("estado").equals("c"))estado_ = Definiciones.Estado.CANCELADA;
                        else estado = Definiciones.Estado.NO_ENTREGADA;
            entregas_1.add(new Entrega(entrega.getInt("idEntrega"),
                                       formatoFecha.parse(entrega.getString("fechaEntrega")),
                                       entrega.getInt("idLineaReceta"),
                                       entrega.getInt("idFarmaceutico"),
                                       estado_));
        }catch(ParseException e){
            e.printStackTrace();
        }
        }


        Conexion.desconectar();

        // Devolvemos vector de medicamentos
        if(entregas_1.size()>0){
            v_entregas = new Entrega[entregas_1.size()];
            entregas_1.toArray(v_entregas);
        }
        return v_entregas;
}


   /**
    * @brief Asgina un entero a id_entrega de la entrega.
    * @param iden Integer a asignar.
    */
    public  void setIdEntrega(Integer iden){
        this._id_entrega = iden;
    }//Asigna un identificador a la entrega.


    /**
     * @brief Asgina un entero a id_entrega de la entrega.
     * @param iden Integer a asignar.
     */
    public  void setFechaEntrega(/*Es un Date*/ Date fecha){
         this._fecha_entrega = fecha;
    }//Asigna una fecha en la que debe entregarse.


    /**
     * @brief Asgina un entero a _pertenece de la entrega.
     * @param pertenece Integer a asignar.
     */
    public  void setIdLineaReceta(Integer pertenece){
        this._idLineaReceta = pertenece;
    }//Asigna un identificador a quien pertenece la entrega.


    /**
     * @brief Asgina un entero a id_entrega de la entrega.
     * @param iden Integer a asignar.
     */
    public  void setIdFarmaceutico(/*Es un identificador*/ Integer entregado){
        this._idFarmaceutico = entregado;
    }//Asigna un identificador para quié es  la entrega.


    /**
     * @brief Asgina un estado a la entrega.
     * @param estado Estado a asignar.
     */
    public  void setEstadoEntrega( Definiciones.Estado estado ){
         this._estado = estado;
    }//Asigna el estado de la entrega

}

